/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.una.pol.pweb.compraventa;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import py.una.pol.pweb.compraventa.modelo.Cliente;
import py.una.pol.pweb.compraventa.modelo.Producto;
import py.una.pol.pweb.compraventa.modelo.Venta;
import py.una.pol.pweb.compraventa.modelo.Ventadetalle;

/**
 *
 * @author irene
 */
@ManagedBean
@ViewScoped
public class VentaBean {

    public VentaBean() {
        
    }
    public Cliente clienteSelected=new Cliente();
    public Producto productoSelected;
    public Venta ventaRealizada;
    public List <Ventadetalle> ventaDetalleRealizado;
    public int cantidadAVender = 0;
    public  List<SelectItem> allClientes;

    public List<Ventadetalle> getVentaDetalleRealizado() {
        return ventaDetalleRealizado;
    }

    public void setVentaDetalleRealizado(List<Ventadetalle> ventaDetalleRealizado) {
        this.ventaDetalleRealizado = ventaDetalleRealizado;
    }

    public void setAllClientes(List<SelectItem> allClientes) {
        this.allClientes = allClientes;
    }

    public List<SelectItem> getAllClientes(List<Cliente> listAllClientes) {
        allClientes = new ArrayList<SelectItem>();
        allClientes.add(new SelectItem(null,"Select One..."));
        Iterator it=listAllClientes.iterator();
        while (it.hasNext()) {

            Cliente element = (Cliente)it.next();
            allClientes.add(new SelectItem(element,element.getNombre()));

        }
        return allClientes;
    }


    public int getCantidadAVender() {
        return cantidadAVender;
    }
    public Producto productoAVender;
    public List<Producto> listaAVender=new ArrayList<Producto>();
    public Producto productoAVenderSelected;

    public Producto getProductoAVender() {
        return productoAVender;
    }

    public void setProductoAVender(Producto productoAVender) {
        this.productoAVender = productoAVender;
    }

    public Producto getProductoAVenderSelected() {
        return productoAVenderSelected;
    }

    public void setProductoAVenderSelected(Producto productoAVenderSelected) {
        this.productoAVenderSelected = productoAVenderSelected;
    }
    
    
    public List<Producto> getListaAVender() {
        return listaAVender;
    }

    public void setListaAVender(List<Producto> listaAVender) {
        this.listaAVender = listaAVender;
    }


    public void setCantidadAVender(int cantidadAVender) {
        this.cantidadAVender = cantidadAVender;
    }

    public Cliente getClienteSelected() {
        return clienteSelected;
    }

    public void setClienteSelected(Cliente clienteSelected) {
        this.clienteSelected = clienteSelected;
    }

    public Producto getProductoSelected() {
        return productoSelected;
    }

    public void setProductoSelected(Producto productoSelected) {
        this.productoSelected = productoSelected;
    }

    public Venta getVentaRealizada() {
        return ventaRealizada;
    }

    public void setVentaRealizada(Venta ventaRealizada) {
        this.ventaRealizada = ventaRealizada;
    }

    public void agregarProductoAVender() {

        productoAVender = new Producto();
        productoAVender.setIdproducto(productoSelected.getIdproducto());
        productoAVender.setNombre(productoSelected.getNombre());
        productoAVender.setDescripcion(productoSelected.getNombre());
        productoAVender.setPreciocompra(productoSelected.getPrecioventa());
        productoAVender.setPrecioventa(productoSelected.getPrecioventa());
        productoAVender.setCantidad(cantidadAVender);
        Iterator iter = listaAVender.iterator();
        boolean existe = false;
        //listaAVender.add(productoAVender);
        
        while (iter.hasNext()) {
            Producto productoActual = (Producto) iter.next();
            System.out.println(productoAVender.getNombre());
            if (productoActual.getIdproducto() == productoAVender.getIdproducto()) {
                
                existe = true;
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Error", "Ya se cargo este producto, elimine de la lista para cambiar"));

            }
        }
        if (existe==false){
            listaAVender.add(productoAVender);
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Exito", "Se agregó el producto al carrito"));

        }
    }
    
    public void eliminarProductoAVender(){
        
        List <Producto> aux=new ArrayList<Producto>();
        Iterator it=listaAVender.iterator();
        while (it.hasNext()) {

            Producto element = (Producto)it.next();
            if (productoAVenderSelected!=null){
                if (element.getIdproducto()!=productoAVenderSelected.getIdproducto()){
                    //listaAVender.remove(element);
                    //break;
                    aux.add(element);
                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage(productoAVenderSelected.getIdproducto().toString(), "Se agregó el producto al carrito"));                    
                }else{

                }
                
            }else{
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("no se selecciono registro", "Se agregó el producto al carrito"));
            }
            

        }
        listaAVender=aux;
        
        
    
    }
    
    public void confirmarProductoAVender(){
    
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("CompraVentaPU");
        EntityManager em = emf.createEntityManager();
        FacesContext context = FacesContext.getCurrentInstance();
        try{
            //código para actualizar el saldo del cliente y el stock del producto
            ventaDetalleRealizado=new ArrayList<Ventadetalle>();    

            em.getTransaction().begin();
            Venta ventax= new Venta();
            ventax.setIdcliente(clienteSelected);
            ventax.setNrofactura("");
            Calendar c1 = Calendar.getInstance();
            ventax.setFecha(c1.getTime());
            
            
            Cliente userx = em.find(Cliente.class, clienteSelected.getIdcliente());
            
            for (Producto elemento:listaAVender){
            
                userx.setSaldo(userx.getSaldo()+(elemento.getCantidad()*elemento.getPrecioventa()));
                Producto productox=em.find(Producto.class, elemento.getIdproducto());
                productox.setCantidad(productox.getCantidad()-elemento.getCantidad());
                Ventadetalle ventadetallex=new Ventadetalle();
                ventadetallex.setIdproducto(productox);
                
                ventadetallex.setIdventa(ventax);
                ventadetallex.setCantidad(productox.getCantidad().doubleValue());
                ventadetallex.setObservaciones("");
                ventadetallex.setPreciocompra(productox.getPreciocompra());
                
                ventadetallex.setPrecioventa(productox.getPrecioventa());
                em.persist(ventadetallex);
                ventaDetalleRealizado.add(ventadetallex);
            
            }
            ventax.setVentadetalleList(ventaDetalleRealizado);
            
            em.persist(ventax);
            em.getTransaction().commit();
            clienteSelected = new Cliente();
            context.addMessage(null, new FacesMessage("Se registró la venta correctamente", "agregado correctamete."));


            
        }catch (Exception e){
            
            context.addMessage(null, new FacesMessage("Ocurrió un error al registrar la venta", "agregado correctamete."));
        
        }finally{
            em.close();
        }
    
    
    }
}
